package com.tbynet.jwp.admin.attachment;

import com.jfinal.aop.Inject;
import com.jfinal.kit.Ret;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.upload.UploadFile;
import com.tbynet.jwp.admin.AdminController;
import com.tbynet.jwp.framework.kit.DateKit;
import com.tbynet.jwp.service.spi.AttachmentManager;
import com.tbynet.jwp.model.Postmeta;
import com.tbynet.jwp.model.Posts;
import com.tbynet.jwp.repository.spi.CommentService;
import com.tbynet.jwp.repository.spi.PostSearchService;
import com.tbynet.jwp.repository.spi.PostService;
import com.tbynet.jwp.repository.spi.UserService;

/**
 * 附件管理控制器
 * @ClassName: AttachmentAdminController
 * @Description: 负责附件的上传、管理、查询等操作
 * @Author: 佰亿互联
 * @Date: 2025年11月4日
 *
 * @Copyright: 2025 www.tbynet.com Inc. All rights reserved.
 * 注意: 本内容仅限于内部传阅，禁止外泄以及用于其他的商业目
 */
public class AttachmentAdminController extends AdminController {

    @Inject
    private PostService postService;

    @Inject
    private UserService userService;

    @Inject
    private CommentService commentService;

    @Inject
    private PostSearchService postSearchService;

    @Inject
    private AttachmentManager attachmentManager;

    /**
     * 附件管理首页
     */
    public void index() {
        try {
            render("index.html");
        } catch (Exception e) {
            log.error("加载附件管理页面失败", e);
            renderError(500);
        }
    }

    /**
     * 搜索附件
     */
    public void search() {
        try {
            String q = getPara("q");

            Page<Posts> page = postSearchService.search(getPage(), getSize(), Posts.POST_TYPE_ATTACHMENT, null, q);

            // 丰富附件信息
            for (Posts post : page.getList()) {
                enrichAttachmentInfo(post);
            }

            ok(Ret.by("data", page));
        } catch (Exception e) {
            log.error("搜索附件失败", e);
            fail("搜索附件失败: " + e.getMessage());
        }
    }

    /**
     * 创建附件页面
     */
    public void create() {
        try {
            render("create.html");
        } catch (Exception e) {
            log.error("加载创建附件页面失败", e);
            renderError(500);
        }
    }

    /**
     * 编辑附件页面
     */
    public void edit() {
        try {
            String postId = getPara("post");
            if (StrKit.isBlank(postId)) {
                fail("附件ID不能为空");
                return;
            }

            Posts post = postService.getPost(postId, Posts.POST_TYPE_ATTACHMENT);
            if (post == null) {
                fail("附件不存在");
                return;
            }

            set("post", post);
            render("edit.html");
        } catch (Exception e) {
            log.error("加载编辑附件页面失败", e);
            fail("加载附件失败: " + e.getMessage());
        }
    }

    /**
     * 保存附件（上传文件）
     */
    public void save() {
        try {
            // 获取上传文件
            UploadFile uploadFile = getFile("file");
            if (uploadFile == null) {
                fail("请选择要上传的文件");
                return;
            }

            // 验证文件
            if (!validateUploadFile(uploadFile)) {
                return;
            }

            // 获取其他参数
            String postParent = getPara("post_parent");
            String postAuthor = getPara("post_author", getLoginUser().getID().toString());

            // 使用AttachmentManager处理附件上传（包含事务）
            Ret result = attachmentManager.uploadAttachment(uploadFile, postParent, postAuthor);

            if (result.isOk()) {
                ok(result);
            } else {
                fail(result.getStr("msg"));
            }
        } catch (Exception e) {
            log.error("上传附件失败", e);
            fail("上传文件失败: " + e.getMessage());
        }
    }

    /**
     * 更新附件信息
     */
    public void update() {
        try {
            String postId = getPara("post");
            if (StrKit.isBlank(postId)) {
                fail("附件ID不能为空");
                return;
            }

            Posts post = postService.getPost(postId, Posts.POST_TYPE_ATTACHMENT);
            if (post == null) {
                fail("附件不存在");
                return;
            }

            // 更新附件基本信息
            updateAttachmentFromRequest(post);

            if (post.update()) {
                ok(Ret.by("msg", "更新附件成功").set("data", post.getID()));
            } else {
                fail("更新附件失败，请联系管理员");
            }
        } catch (Exception e) {
            log.error("更新附件失败", e);
            fail("更新附件失败: " + e.getMessage());
        }
    }

    /**
     * 删除附件
     */
    public void delete() {
        try {
            String postId = getPara("post");
            if (StrKit.isBlank(postId)) {
                fail("附件ID不能为空");
                return;
            }

            Posts post = postService.getPost(postId, Posts.POST_TYPE_ATTACHMENT);
            if (post == null) {
                fail("附件不存在");
                return;
            }

            // TODO: 实现附件删除逻辑，包括文件删除和数据库记录删除
            // 需要先删除物理文件，再删除数据库记录

            fail("删除功能暂未实现");
        } catch (Exception e) {
            log.error("删除附件失败", e);
            fail("删除附件失败: " + e.getMessage());
        }
    }

    /**
     * 文件管理器页面
     */
    public void finder() {
        try {
            render("finder.html");
        } catch (Exception e) {
            log.error("加载文件管理器页面失败", e);
            renderError(500);
        }
    }

    // ============ 私有方法 ============

    /**
     * 丰富附件信息
     */
    private void enrichAttachmentInfo(Posts post) {
        try {
            // 获取附件文件名
            Postmeta attachedFile = postService.getPostmeta(post.getID(), Postmeta._wp_attached_file);
            post.put("filename", attachedFile != null ? attachedFile.getMetaValue() : "");

            // 获取作者信息
            post.put("author", userService.getById(post.getPostAuthor()));

            // 获取评论数量
            post.put("comments", commentService.countByPostId(post.getID()));

            // 格式化修改时间
            post.put("post_modified_format", DateKit.format(post.getPostModified(), "yyyy-MM-dd"));

        } catch (Exception e) {
            log.error("丰富附件信息失败，附件ID：{}", post.getID(), e);
        }
    }

    /**
     * 验证上传文件
     */
    private boolean validateUploadFile(UploadFile uploadFile) {
        if (uploadFile.getFile() == null) {
            fail("上传文件无效");
            return false;
        }

        if (uploadFile.getFile().length() == 0) {
            fail("上传文件为空");
            return false;
        }

        // TODO: 可以添加文件类型、大小等验证
        // 例如：检查文件类型是否允许，文件大小是否超限等

        return true;
    }

    /**
     * 从请求更新附件信息
     */
    private void updateAttachmentFromRequest(Posts post) {
        String postTitle = getPara("post_title");
        if (StrKit.notBlank(postTitle)) {
            post.setPostTitle(postTitle);
        }

        String postContent = getPara("post_content");
        if (StrKit.notBlank(postContent)) {
            post.setPostContent(postContent);
        }

        String postExcerpt = getPara("post_excerpt");
        if (StrKit.notBlank(postExcerpt)) {
            post.setPostExcerpt(postExcerpt);
        }

        // 更新修改时间
        post.setPostModified(new java.util.Date());
        post.setPostModifiedGmt(new java.util.Date());
    }
}